Imports FairShop.Operaties
Imports System.ComponentModel

''' <summary>
''' Scherm om de lijst van verkopen te tonen (bv. kasblad of verkoop per factuur)
''' </summary>
''' <remarks></remarks>
Public Class VerkopenForm

    Private _mainForm As Form
    Private _prf As PerformantieHelper

#Region "Public property's"

    Private _kanWijzigen As Boolean
    Public Property KanWijzigen() As Boolean
        Get
            Return _kanWijzigen
        End Get
        Set(ByVal value As Boolean)
            _kanWijzigen = value
            tsbWijzigen.Enabled = value
        End Set
    End Property

    Private _kanVerwijderen As Boolean
    Public Property KanVerwijderen() As Boolean
        Get
            Return _kanVerwijderen
        End Get
        Set(ByVal value As Boolean)
            _kanVerwijderen = value
            tsbVerwijderen.Enabled = value
            BindingNavigatorDeleteItem.Enabled = value
        End Set
    End Property

    Private _kanBewaren As Boolean
    Public Property KanBewaren() As Boolean
        Get
            Return _kanBewaren
        End Get
        Set(ByVal value As Boolean)
            _kanBewaren = value
            tsbBewaren.Enabled = value
            BindingNavigatorSaveItem.Enabled = value
        End Set
    End Property

#End Region

#Region "Constructors"

    Public Sub New(ByVal mainForm As Form)
        Me.InitializeComponent()
        _prf = New PerformantieHelper("Opstarten VerkopenForm")
        _mainForm = mainForm
        KanVerwijderen = False
        KanWijzigen = False
        Me.BindingNavigatorAddNewItem.Visible = False
        Me.BindingNavigatorSaveItem.Visible = False
        Me.BindingNavigator1.AddNewItem = Nothing
        Me.BindingNavigator1.DeleteItem = Nothing
        SetSecurity()
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Try
            Me.WinkeliersBindingSource.DataSource = Utility.Data
            Me.VerkoopsoortenBindingSource.DataSource = Utility.Data
            Me.VerkopenBindingSource.DataSource = Utility.Data

            InitGrid()
            KanBewaren = False
            _prf.LogMeting()
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het inladen van de gegevens")
            log.WriteError("VerkopenForm.OnLoad", ex)
        End Try
    End Sub

#End Region

#Region "Event handling"

    Protected Overrides Sub OnKeyUp(ByVal e As KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F12
                Me.Close()
            Case Keys.F2
                If (KanBewaren) Then Return
                BewaarWijzigingen()
            Case Keys.F3
                If (KanVerwijderen) Then Return
                Verwijderen()
            Case Keys.F4
                If (Not tsbNieuw.Enabled) Then Return
                NieuweVerkoop()
            Case Keys.F6
                If (Not KanWijzigen) Then Return
                If (Grid1.SelectedRows.Count > 0) Then
                    Me.BeheerVerkoop(Grid1.SelectedRows(0).Index)
                End If
        End Select
    End Sub

    Private Sub tsbBewaren_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbBewaren.Click
        BewaarWijzigingen()
    End Sub

    Private Sub tsbSluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbSluiten.Click
        Me.Close()
    End Sub

    Private Sub Grid1_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles Grid1.CellFormatting
        ' de laatste rij is de nieuwe rij, daarop moeten geen details getoond worden
        If (e.RowIndex < Grid1.NewRowIndex AndAlso e.ColumnIndex = Grid1.Columns("AantalDetails").Index) Then
            e.Value = String.Format("{0} detail(s)", e.Value)
        End If
    End Sub

    Private Sub Grid1_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles Grid1.CellContentClick
        If (e.ColumnIndex = Grid1.Columns(Utility.Data.Verkopen.AantalDetailsColumn.ColumnName).Index) Then
            Dim verkoopRow As ArtikelsDataSet.VerkopenRow = Utility.GetGridDataRow(Of ArtikelsDataSet.VerkopenRow)(Grid1, e.RowIndex)
            If (verkoopRow Is Nothing) Then Return ' bijvoorbeeld bij dubbelklikken op lege rij onderaan

            Try
                Cursor = Cursors.WaitCursor
                Dim detailsForm As New VerkoopDetailsForm(verkoopRow.Id)
                If (detailsForm.ShowDialog() = DialogResult.OK) Then
                    ' TODO: update grid (sommige zaken gaan vanzelf)
                End If
            Finally
                Cursor = Cursors.Default
            End Try
        End If
    End Sub

    Private Sub Grid1_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Grid1.SelectionChanged
        Dim kanBeheren As Boolean = Security.IsAdmin() OrElse Security.IsWinkelwerking
        KanWijzigen = (kanBeheren AndAlso Grid1.SelectedRows.Count > 0)
        KanVerwijderen = (kanBeheren AndAlso Grid1.SelectedRows.Count > 0)
        'KanVerwijderen = False
        'If (kanBeheren AndAlso Grid1.SelectedRows.Count > 0) Then
        '    Dim verkoopRow As ArtikelsDataSet.VerkopenRow = Utility.GetGridDataRow(Of ArtikelsDataSet.VerkopenRow)(Grid1, Grid1.SelectedRows(0).Index)
        '    If (verkoopRow Is Nothing) Then Return ' bijvoorbeeld bij dubbelklikken op lege rij onderaan

        '    If (verkoopRow.AantalDetails = 0) Then ' werkt niet de eerste keer
        '        ' Alleen verkopen zonder details eraan gekoppeld kunnen verwijderd worden
        '        KanVerwijderen = True
        '    End If
        'End If
    End Sub

    Protected Overrides Sub OnClosing(ByVal e As CancelEventArgs)
        MyBase.OnClosing(e)
        If (Not Me.Validate()) Then
            e.Cancel = True
            Return
        End If
        Me.VerkopenBindingSource.EndEdit()
        If (Utility.Data.HasChanges()) Then
            Dim result As DialogResult = MessageBox.Show("Deze lijst met verkopen bevat wijzigingen. Wil je de wijzigingen bewaren?", "Bewaren", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)
            Select Case result
                Case Windows.Forms.DialogResult.Yes
                    BewaarWijzigingen()
                Case Windows.Forms.DialogResult.Cancel
                    e.Cancel = True
                    Return
                Case Windows.Forms.DialogResult.No
                    Utility.Data.RejectChanges()
                    ' gewoon laten sluiten
            End Select
        End If
        ' We have to dispose of the grid before the form closes to avoid possible DataErrors from the GridViewComboBoxColumn
        Me.Grid1.Dispose()
        _mainForm.BringToFront()
    End Sub

    Private Sub Grid1_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles Grid1.DataError
        MsgBox.ShowError("Ongeldige invoer. Bij een wijziging, druk Esc om de vorige waarde te herstellen")
        log.WriteError("VerkopenForm.Grid1_DataError", e.Exception)
        e.Cancel = True
    End Sub

    Private Sub Grid1_CellDoubleClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles Grid1.CellDoubleClick
        BeheerVerkoop(e.RowIndex)
    End Sub

    Private Sub tsbVerwijderen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbVerwijderen.Click
        Verwijderen()
    End Sub

    Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BindingNavigatorDeleteItem.Click
        Verwijderen()
    End Sub

    Private Sub btnNieuw_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.NieuweVerkoop()
    End Sub

    Private Sub tsbWijzigen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbWijzigen.Click
        If (Grid1.SelectedRows.Count > 0) Then
            BeheerVerkoop(Grid1.SelectedRows(0).Index)
        End If
    End Sub

    Private Sub VerkopenBindingSource_ListChanged(ByVal sender As Object, ByVal e As ListChangedEventArgs) Handles VerkopenBindingSource.ListChanged
        KanBewaren = True
    End Sub

    Private Sub tsbNieuw_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbNieuw.Click
        NieuweVerkoop()
    End Sub

    Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BindingNavigatorAddNewItem.Click
        If (Not tsbNieuw.Enabled) Then Return
        NieuweVerkoop()
    End Sub

    Private Sub Grid1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Grid1.CurrentCellDirtyStateChanged
        KanBewaren = True
    End Sub

#End Region

#Region "Helperfuncties"

    Private Sub InitGrid()
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.IdColumn.ColumnName, Grid1)
            .Visible = False ' Autonumber niet tonen
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.DatumColumn.ColumnName, Grid1)
            .Width = 80
            .HeaderText = "Datum"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.IdSoortColumn.ColumnName, Grid1)
            .Width = 80
            .HeaderText = "Soort"
            Dim column As DataGridViewComboBoxColumn = DirectCast(DataGridViewHelper.GetGridColumnByDataName _
                (Utility.Data.Verkopen.IdSoortColumn.ColumnName, Grid1), DataGridViewComboBoxColumn)
            column.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing ' verberg de uitklappijl
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.IdWinkelierColumn.ColumnName, Grid1)
            .Width = 100
            .HeaderText = "Winkelier"
            Dim column As DataGridViewComboBoxColumn = DirectCast(DataGridViewHelper.GetGridColumnByDataName _
                (Utility.Data.Verkopen.IdWinkelierColumn.ColumnName, Grid1), DataGridViewComboBoxColumn)
            column.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing ' verberg de uitklappijl
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.OmschrijvingColumn.ColumnName, Grid1)
            .Width = 100
            .HeaderText = "Omschrijving"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.BegintotaalColumn.ColumnName, Grid1)
            .Width = 80
            .HeaderText = "Begintotaal"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.EindtotaalColumn.ColumnName, Grid1)
            .Width = 80
            .HeaderText = "Eindtotaal"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.InUitKasBedragColumn.ColumnName, Grid1)
            .Width = 100
            .HeaderText = "In/uit kas"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.NaarBankBedragColumn.ColumnName, Grid1)
            .Width = 110
            .HeaderText = "Naar bank"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.AantalDetailsColumn.ColumnName, Grid1)
            .Width = 140
            .HeaderText = "Aantal details"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
        End With
    End Sub

    Private Function BewaarWijzigingen() As Integer
        'MyBase.Bewaar(Utility.Data.Verkopen, "verko(o)p(en)", Me.KanBewaren)
        Try
            Cursor = Cursors.WaitCursor
            If (Not Me.Validate()) Then Return 0
            Me.VerkopenBindingSource.EndEdit()

            Dim aantalToegevoegd As Integer = 0
            Dim aantalVerwijderd As Integer = 0
            Dim aantalGewijzigd As Integer = 0

            For i As Integer = Utility.Data.Verkopen.Count - 1 To 0 Step -1
                ' achterstevoren omdat aantal verkopen kan veranderen tijdens de lus
                Dim row As ArtikelsDataSet.VerkopenRow = Utility.Data.Verkopen(i)
                Select Case row.RowState
                    Case DataRowState.Added
                        aantalToegevoegd += 1
                        Dal.VerkoopToevoegen(row)
                    Case DataRowState.Deleted
                        aantalVerwijderd += 1
                        ' TODO: verwijderen samen met details
                    Case DataRowState.Modified
                        aantalGewijzigd += 1
                End Select
            Next
            Dim verkopenTableAdapter As New ArtikelsDataSetTableAdapters.VerkopenTableAdapter
            Dim aantal As Integer = verkopenTableAdapter.Update(Utility.Data.Verkopen)
            'Dim msg As String = String.Format("{0} verko(oop(en) werd aangepast.{1}{2} verko(oop(en) werden toegevoegd.{3}{4} verko(oop(en) werden verwijderd.", _
            '    aantalGewijzigd, Environment.NewLine, aantalToegevoegd, Environment.NewLine, aantalVerwijderd)
            'MessageBox.Show(msg, "Bewaren", MessageBoxButtons.OK, MessageBoxIcon.Information)
            KanBewaren = False
            Return aantal + aantalToegevoegd
        Catch ex As Exception
            log.WriteError("VerkopenForm.BewaarWijzigingen", ex)
            If (ex.ToString.Contains("VerkoopsDetails")) Then
                MsgBox.ShowError("Er werd mogelijk geprobeerd verkopen met details te verwijderen. Dit gaat niet. De wijzigingen worden ongedaan gemaakt.")
                Utility.Data.Verkopen.RejectChanges()
            Else
                MsgBox.ShowError("Fout tijdens het bewaren")
            End If
        Finally
            Cursor = Cursors.Default
        End Try
        Return 0
    End Function

    'Private Sub Verwijderen()
    '    Try
    '        Cursor = Cursors.WaitCursor
    '        If Me.Grid1.SelectedRows.Count > 0 Then
    '            Dim selectedRow As DataGridViewRow = Grid1.SelectedRows(0)
    '            Grid1.Rows.Remove(selectedRow)
    '            KanBewaren = True
    '        End If
    '    Catch ex As Exception
    '        MsgBox.ShowError("Fout tijdens het verwijderen")
    '        log.WriteError("VerkopenForm.Verwijderen", ex)
    '    Finally
    '        Cursor = Cursors.Default
    '    End Try
    'End Sub

    Private Sub Verwijderen()
        Try
            Cursor = Cursors.WaitCursor
            If Me.Grid1.SelectedRows.Count > 0 Then
                If MessageBox.Show("De volledige verkoop wordt verwijderd. Dit kan niet ongedaan gemaakt worden. Ben je zeker?", _
                                        "Waarschuwing", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = DialogResult.Yes Then
                    Dim idVerkoop As Integer = Utility.GetGridDataRow(Of ArtikelsDataSet.VerkopenRow)(Grid1, Grid1.SelectedRows(0).Index).Id
                    ArtikelsBL.DeleteVerkoop(idVerkoop)
                End If
            End If
        Catch ex As Exception
            log.WriteError("VerkoopForm.VerkoopVerwijderen", ex)
            MsgBox.ShowError("Fout tijdens het verwijderen van de verkoop")
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub BeheerVerkoop(ByVal rowIndex As Integer)
        Try
            Cursor = Cursors.WaitCursor
            Dim verkoopRow As ArtikelsDataSet.VerkopenRow = Utility.GetGridDataRow(Of ArtikelsDataSet.VerkopenRow)(Grid1, rowIndex)
            If (verkoopRow Is Nothing) Then Return ' bijvoorbeeld bij dubbelklikken op lege rij onderaan

            Dim editForm As New VerkoopForm(verkoopRow.Id)
            If (editForm.ShowDialog() = DialogResult.OK) Then
                ' update grid gaat vanzelf
            End If
            'End Select
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het wijzigen van de verkoop")
            log.WriteError("VerkopenForm.BeheerVerkoop", ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub NieuweVerkoop()
        Try
            Cursor = Cursors.WaitCursor
            Dim insertForm As New VerkoopForm()
            insertForm.ShowDialog()
            ' update grid gaat vanzelf
            VerkopenBindingSource.Position = VerkopenBindingSource.Find("ID", insertForm.IdVerkoop)
        Catch ex As Exception
            log.WriteError("VerkopenForm.NieuweVerkoop", ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub SetSecurity()
        Dim kanBeheren As Boolean = Security.IsAdmin() OrElse Security.IsWinkelwerking
        tsbNieuw.Visible = kanBeheren
        tsbVerwijderen.Visible = kanBeheren
        tsbWijzigen.Visible = kanBeheren
        tsbBewaren.Visible = kanBeheren

        Grid1.AllowUserToAddRows = kanBeheren
        Grid1.AllowUserToDeleteRows = kanBeheren
        Grid1.ReadOnly = True ' gebruiker moet VerkoopForm maar gebruiken om te wijzigen

        ToolStripSeparator1.Visible = kanBeheren
        ToolStripSeparator2.Visible = kanBeheren
        ToolStripSeparator3.Visible = kanBeheren
        BindingNavigatorDeleteItem.Visible = kanBeheren
    End Sub

#End Region

End Class